// import $ from "jquery";
// import wx from '@/assets/tools/WxSdk';

function oRouterEngine(engine) {
  this.engine = engine;
  // 路由器，动态注册制、路由控制。
  this.router = this.engine.vue.$router;
  // 当前路由信息
  this.route = this.engine.vue.$route;

}

oRouterEngine.prototype = {
  // 需要在主函数rander中渲染，否则无法加载函数库，因为router的初始化是最前置的。
  init: function () {
    // let o = this;
    // // 判断当前页面是否是未注册的，如果是，则WAIT_REG_URL会包含数据。
    // if (!this.engine.tools.IsNullOrEmpty(this.getter().WAIT_REG_URL)) {
    //   // 此处base64.encode有个bug。。就是输入的字符串如果是[.../?...]，里面的斜杠不会被转移。。导致url看起来多了一层。。。fuck。。。
    //   let base64_url = this.engine.tools.base64.encode(this.getter().WAIT_REG_URL);
    //   let me_url = "/ESB/Security/Permission/Module/Exists/?url=" + base64_url;
    //   // 发起模块检测请求，如果有该菜单、地址，且当前账户有这个权限，则会返回200及权限列表，否则输出返回的异常。
    //   this.engine.request.api.get(me_url,
    //     // 处理回调事件，通过分析data.status.code的状态来实现。
    //     function (data) {
    //       console.log("模块鉴权：" + JSON.stringify(data));
    //       if (data.status.code == 200) {
    //         o.getter().URL_Data = data.content;// 保存菜单的ID，后续页面请求接口时要传到后台ESB用于当前页面下的当前接口的权限验证。
    //         o.getter().addRoutes([{
    //           path: o.getter().URL_Data.Module,
    //           name: 'DynamicModule',// 每个页面只会存在一个【动态模块】，所以统一名字。
    //           component: require('@/components' + o.getter().URL_Data.Module).default
    //         }]);
    //         // 虽然数据库是模糊匹配，但是前端是严格按照请求URL回调的，所以如果注册的模块和请求的地址不一样，也是不能访问的。
    //         o.getter().push({path: o.getter().WAIT_REG_URL});
    //       }
    //       else {
    //         // 如果没有匹配到，则跳转404页面。
    //         // let NotFound = "/Base/NotFound";
    //         // 404页面是预先注册的。
    //         // o.getter().addRoutes([{
    //         //   path: NotFound,
    //         //   name: 'DynamicModule',// 每个页面只会存在一个【动态模块】，所以统一名字。
    //         //   component: require('@/components/Engine' + NotFound).default
    //         // }]);
    //         o.getter().push({path: "/Error/NotFound?url=" + base64_url});
    //       }
    //       // 清空，表示本次处理已完成。
    //       o.getter().WAIT_REG_URL = "";
    //     });
    // }
    // // 注册完成完整再跳转本页面，这个时候是含注册路由信息了，所以直接进入else的next()方法。
    // router.push({path: to.fullPath});
  },
  get: function () {
    return this.route;
  },
  getter: function () {
    // 切换时隐藏
    // $("[o-container-app]").fadeOut(1000);
    // $("[o-container-app]").css("display", "none");
    // $("[o-container-app]").animate({width:'0px'});
    return this.router;
  },
  // 更新路由route，非router。
  set: function (r) {
    this.route = r;
  },
  // 设置跳转的目标路由，不同级别层级调用太麻烦，太复杂，由八爪鱼引擎统一处理。
  jump: function (p) {
    // name 或 path 必选一项
    // 可选浏览器url?id=999参数为 query: {id: 999}
    // 可选路由传递参数为 params: {data: to.fullPath},
    this.engine.tools.isApplet().then(res => {
      if (res) {
        // 小程序跳转
        if (p.indexOf('pages') > -1) {
          return this.engine.applet.wxNavgateTo(p);
        }
        this.getter().push({path: p});
      } else {
        // 正常跳转
        this.getter().push({path: p});
      }
    })
  },
  // 指定的跳转到登陆页
  jumplogin: function () {
    // 如果是移动端，则返回移动端的登陆页。
    if (this.engine.tools.isMobile()) {
      try {
        if (window.webkit) {
          window.webkit.messageHandlers.setLogin.postMessage(false);
        } else if (window.Android) {
          window.setLogin.setLogin();
        }
      } catch (err) {
        // alert(JSON.stringify(err));
      }

      // try {
      //   window.webkit.messageHandlers.setLogin.postMessage(false);
      // }catch (e) {
      //   this.engine.tips.warning("未找到原生定义。");
      // }

      // try {
      //   android.setLogin(false);
      // }catch (e) {
      //   this.engine.tips.warning("未找到原生定义。");
      // }

      this.engine.tools.isApplet().then(res => {
        if (res) {
          // 小程序跳转，兼容微信和支付宝
          this.engine.applet.logout();
        } else {
          let param = this.octopus.router.get().query;
          // 如果是蓝鸽登陆
          if (param.code) {
            console.error("return login:" + window.location.href);
            // 跳转app
            this.jump("/main/app/campus/login?code=" + param.code);
          }
          //
          else {
            // 跳转app
            this.jump("/main/app/building/login");
          }
        }
      });
    } else {
      //  pc 跳转
      // this.jump("/main/platform/login");
      window.parent.location.href = "/main/platform/login";
    }
  },
  // 注册路由
  register: function (url, callback) {
    let o = this;
    // 如果为空，则不处理，也不会有callback
    if (!this.engine.tools.IsNullOrEmpty(url)) {
      // 此处base64.encode有个bug。。就是输入的字符串如果是[.../?...]，里面的斜杠不会被转移。。导致url看起来多了一层。。。fuck。。。
      let me_url = "/ESB/Security/OAuth2/Module/Exists/?url=" + this.engine.tools.base64.encode(url);
      // 发起模块检测请求，如果有该菜单、地址，且当前账户有这个权限，则会返回200及权限列表，否则输出返回的异常。
      this.engine.request.api.get(me_url,
        // 处理回调事件，通过分析data.status.code的状态来实现。
        function (data) {
          // 此处返回模块数据以及对应模块的权限，需要保存至全局对象，供当前页面或组件获取。
          // 此处得到的权限用于做功能权限，比如按钮什么的在这里返回，然后路由给当前页面（非组件）
          o.source = data;
          // console.log(JSON.stringify(data));
          if (data.status.code == 200) {

            // 此处已经注册成功，外部可以正常跳转了。
            // o.engine.router.getter().URL_Data = data.content;// 保存菜单的ID，后续页面请求接口时要传到后台ESB用于当前页面下的当前接口的权限验证。
            // o.engine.router.getter().addRoutes([{
            //   path: data.content.Url,// 路径绑定的是url，但是注册的组件地址采用module的方式
            //   name: 'DynamicModule_' + data.content.ID,// 每个页面只会存在一个【动态模块】，所以统一名字。
            //   component: require('@/components' + data.content.Module).default // 太坑了。。。require是全部加载。
            // }]);
            o.engine.router.getter().addRoutes([{
              path: data.content.Url,// 路径绑定的是url，但是注册的组件地址采用module的方式
              name: 'DynamicModule_' + data.content.ID,// 每个页面只会存在一个【动态模块】，所以统一名字。
              component: () => import('@/components' + data.content.Module) // 此项为动态加载页面，这样无论创建多少页面，总体app.js体积不会增长。
              // 大小永远是当前引用框架的大小 + 当前注册页面的大小。
            }]);

            // API是严格匹配，所以如果注册的模块和请求的地址不一样是不能访问的。
            // o.engine.router.getter().push({path: reg_url});
          }

          // 如果存在回调，则发起回调。
          if (callback) {
            callback(data);
          }
        });
    }
  }
}

export {
  oRouterEngine
}


